package com.example.service;


import com.example.entity.UserInfo;
import com.example.mapper.UserInfoMapper;
import com.example.dto.LoginRequest;
import com.example.dto.LoginResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.nio.charset.StandardCharsets;
import java.util.UUID;

/**
 * 用户服务实现类
 * 作用：处理用户相关的业务逻辑
 */
@Service // 标识这是一个Spring的服务层组件，会被Spring容器管理
public class UserService {

    /**
     * 用户数据访问接口
     * 使用@Autowired自动注入UserInfoMapper的实现
     */
    @Autowired
    private UserInfoMapper userInfoMapper;

    /**
     * 用户登录业务方法
     * @param loginRequest 登录请求参数
     * @return 登录响应信息
     *
     * 业务逻辑步骤：
     * 1. 参数验证
     * 2. 查询用户是否存在
     * 3. 验证密码
     * 4. 生成登录令牌
     * 5. 返回登录结果
     */
    public LoginResponse login(LoginRequest loginRequest) {
        // 步骤1：参数验证
        if (loginRequest == null ||
                loginRequest.getUserName() == null || loginRequest.getUserName().trim().isEmpty() ||
                loginRequest.getPassword() == null || loginRequest.getPassword().trim().isEmpty()) {
            throw new IllegalArgumentException("用户名和密码不能为空");
        }

        String userName = loginRequest.getUserName().trim();
        String password = loginRequest.getPassword().trim();

        // 步骤2：查询用户是否存在
        UserInfo userInfo = userInfoMapper.selectByUserName(userName);
        if (userInfo == null) {
            // 用户不存在，抛出业务异常
            throw new RuntimeException("用户名或密码错误");
        }

        // 步骤3：验证密码
        // 注意：实际项目中应该使用加密密码比较
        // 这里为了演示直接明文比较，实际应该使用BCrypt等加密方式
        if (!userInfo.getPassword().equals(password)) {
            // 密码错误，抛出业务异常
            throw new RuntimeException("用户名或密码错误");
        }

        // 步骤4：生成登录令牌
        // 实际项目中应该使用JWT等安全的令牌机制
        // 这里使用UUID模拟令牌生成
        String token = generateToken(userInfo);

        // 步骤5：构建并返回登录响应
        LoginResponse loginResponse = new LoginResponse();
        loginResponse.setUserId(userInfo.getId());
        loginResponse.setUserName(userInfo.getUserName());
        loginResponse.setToken(token);

        return loginResponse;
    }

    /**
     * 生成用户登录令牌
     * @param userInfo 用户信息
     * @return 登录令牌字符串
     *
     * 实际项目中应该：
     * 1. 使用JWT生成包含用户信息的令牌
     * 2. 设置合理的过期时间
     * 3. 使用安全的签名算法
     */
    private String generateToken(UserInfo userInfo) {
        // 使用UUID生成唯一令牌
        String uuid = UUID.randomUUID().toString();

        // 组合用户ID和UUID生成更安全的令牌
        String rawToken = userInfo.getId() + ":" + uuid + ":" + System.currentTimeMillis();

        // 使用MD5加密（实际项目中应该使用更安全的加密方式）
        return DigestUtils.md5DigestAsHex(rawToken.getBytes(StandardCharsets.UTF_8));
    }

    /**
     * 根据用户ID获取用户信息
     * @param userId 用户ID
     * @return 用户信息
     */
    public UserInfo getUserById(Integer userId) {
        // 这里简化实现，实际应该从数据库查询
        // 只是为了演示Service层可以有多个方法
        return userInfoMapper.selectByUserName("admin"); // 示例返回
    }
}